# 函数的定义：可重复使用的，用来实现某个功能的代码段。
#
# - 函数的参数：
#   * 必要传参
#   * 默认传参
#   * 关键字传参
#   * 不定长传参
#
# - 函数的返回值
#   * 作用：函数调用后，返回需要的计算结果
#   * return关键字：执行之后 函数内部后面的代码不再执行，没有返回值的时候 返回的是 None
#
# - 局部变量和全局变量
#
#   * 局部变量：在函数内部定义的变量，只能在函数内部使用。
#   * 全局变量：是在函数外部定义的变量，所有函数内部都可以使用这个变量。


# 易错题
def test(a, lst1=[1, 2]):  # 定义一个函数
    # 把a添加到列表中
    if a not in lst1:
        lst1.append(a)
    return lst1


print(f'第一次调用test函数的结果是：{test(10)}')  #  1, 2, 10
print(f'第二次调用test函数的结果是：{test(20)}')  #  1, 2, 20 ,正确的是：1， 2，10，20
# 第二次调用 内存中已经有一个列表了，内存地址映射的值是 1, 2, 20,所以后面追加
print(f'第三次调用test函数的结果是：{test(30, lst1=[60, 70])}')  # 正确的是：60，70，30
# 执行第三次调用，lst1=[60, 70] 有一个临时的 内存地址 ，不在用默认的那个列表的内存地址了，
# lst1=[60, 70] 后面追加，所以是：60，70，30
print(f'第四次调用test函数的结果是：{test(40)}')  # 正确的是：[1, 2, 10, 20, 40]
# 执行第四次调用时，第三次调用的内存中临时的lst1=[60, 70] 失效，此时引用内存中默认的那个list的内存地址映射
# 所以是在第二次调用的结果 list [1， 2，10，20] 之后追加：正确结果：[1, 2, 10, 20, 40]



lst = [1, 2]
print(id(lst))
lst = [3, 4]
print(id(lst))

